import org.apache.commons.lang.RandomStringUtils
import grails.converters.*
class InscricaoController {
   // def authenticateService
    def inscricaoService
    CriptografiaDescriptografia cript  = new CriptografiaDescriptografia()
    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
    def index = {
        redirect(action: "list", params: params)
    }
    
  
    def status  = {
        def inscricaoInstance = Inscricao.findByIdAndChave(params.id,params.chave)
        def inscricaoInstanceAcompanhamento = InscricaoAcompanhamento.findAllByInscricao(inscricaoInstance ,['sort':'id','order':'desc'])[0]
        if (inscricaoInstance ) {
            def banco =  inscricaoService.ajaxEdit(inscricaoInstance.id)
            return [liberacao : Liberacao.list('sort':'id' , 'order':'desc')[0] ,inscricaoInstanceAcompanhamento: banco.inscricaoInstanceAcompanhamento, person:banco.inscricaoInstance,  itens: banco.itens , indexador: params.indexador ,usuario:banco.usuario]
        } else {
            render 'NÃO PERMITIDO' }
    }



    def detalhesInscricao = { 
         return [person: Inscricao.get(params.id)]

    }








    def listAllXML = {
        render Inscricao.list() as XML
    }
    def list = {       
        [inscricaoInstanceList: Inscricao.list('sort':'id' , 'order':'asc'), inscricaoInstanceTotal: Inscricao.count()]

    }
    def create = {
        def inscricaoInstance = new Inscricao()
        inscricaoInstance.properties = params
        return [inscricaoInstance: inscricaoInstance]
    }
    def save = {

       

        def find = Inscricao.findAllByCnesAndModalidadeAtendimento(params.cnes,params.modalidadeAtendimento)
         if(find) {

             def inscricaoInstance = new Inscricao()
             flash.message = "Erro, Estabelecimento de Saúde já Cadastrada Nesta Modalidade"
             render(view: "create", model: [inscricaoInstance: inscricaoInstance])

         }


        def pass = cript.criptografaLogin(params.pass)
        def inscricaoInstance = new Inscricao()
        inscricaoInstance.properties = params
        inscricaoInstance.chave = RandomStringUtils.randomAlphanumeric(8)
        inscricaoInstance.usuario = new Usuario()
        def usuarioInstance = new Usuario(
            params.email,
            params.responsavel,
            authenticateService.encodePassword(params.passwd),
            authenticateService.encodePassword(params.pass),
            params.email,
            params.email2,
            pass
        )
        if(usuarioInstance.save()    ){
           
            inscricaoInstance.usuario = usuarioInstance
            inscricaoInstance.contadorId = inscricaoService.idInscricao()
            inscricaoInstance.inscricao = '2010/' +  String.format("%03d", inscricaoInstance.contadorId)
            if (inscricaoInstance.save()) {
                Inscricao.contador ++
                def authority = Permissao.findByAuthority('ROLE_USER')
                def role_web = Permissao.get(authority.id)
                role_web.addToPeople(inscricaoInstance.usuario)
                role_web.save()
                def inscricaoAcompanhamentoInstance = new InscricaoAcompanhamento()
                inscricaoAcompanhamentoInstance.inscricao = new Inscricao()
                inscricaoAcompanhamentoInstance.inscricao.id = inscricaoInstance.id
                if( inscricaoAcompanhamentoInstance.save() ) {} else {
                    println inscricaoInstance.id
                    inscricaoAcompanhamentoInstance.errors.allErrors.each {
                        println it

                    }
                    inscricaoInstance.delete()
                    usuarioInstance.delete()
                 
                    render(view: "create", model: [inscricaoInstance: inscricaoInstance, usuarioInstance: usuarioInstance])

                }
                enviarEmail(inscricaoInstance,Configuracoes.link())
                flash.message = "Instituicao cadastrada com sucesso"
                redirect(action: "aviso")
            }
            else {
                def instance = inscricaoInstance
                inscricaoInstance.errors.allErrors.each {
                        println it

                    }

                render(view: "create", model: [inscricaoInstance: instance, usuarioInstance: usuarioInstance ])
                usuarioInstance.delete()
            }
        } else {
              usuarioInstance.errors.allErrors.each {
                        println it

                    }
            render(view: "create", model: [inscricaoInstance: inscricaoInstance, usuarioInstance: usuarioInstance])
            usuarioInstance.delete()
        }
    }    
    def aviso = {
        // renderiza o aviso
    }
    def confirmacao = {
        def inscricaoInstance = Inscricao.get(params.id)
        if (inscricaoInstance.ativo == true) {
            render  """
            <h2>Bem vindo,</h2>
<p>Caro usuário, ${inscricaoInstance.usuario.userRealName}, o processo de inscrição on-line ocorreu com sucesso. </p>
<p><a href="${Configuracoes.link()}" ><font style="color:red;">Página de acesso às informações</font></a></p>
<p>Ao acessar essa página, será necessário digitar o seu e-mail e senha</p>
<p>Ao informar os dados necessários, você terá acesso às informações adicionais
de sua inscrição, como o status de seu processo. Nessa página você poderá clicar
no botão &quot;imprimir &quot; que abrirá o aplicativo de impressão de seu computador. </p>
           """
        } 
    }
    def validacao = {
        CriptografiaDescriptografia cripts  = new CriptografiaDescriptografia()

        def inscricaoInstance = Inscricao.get(params.id)
        if(inscricaoInstance.chave == params.chave){
            inscricaoInstance.ativo = true
            inscricaoInstance.save()            
            def myhtml = """
<center><img src="http://blog.sms.fortaleza.ce.gov.br/wp-content/themes/sms/images/brazao-pmf-220x100.gif" /></center>
            <h2>Bem vindo,</h2>
<p>Caro usuário, ${inscricaoInstance.usuario.userRealName}, o processo de inscrição on-line ocorreu com sucesso. </p>
<p>Esses são os seus dados de acesso.</p>
<p>Nome de usuário: ${inscricaoInstance.usuario.username}</p>
<p>Senha: ${cripts.decriptografarSenha(inscricaoInstance.usuario.keyPass)}</p>
<p><a href="${Configuracoes.link()}" >Página de acesso às informações</a></p>
<p>Ao acessar essa página, será necessário digitar o seu e-mail e senha.</p>
<p>Ao informar os dados necessários, você terá acesso às informações adicionais
de sua inscrição, como o status de seu processo. Nessa página você poderá clicar
no botão &quot;imprimir &quot; que abrirá o aplicativo de impressão de seu computador. </p>
        """
            sendMail {
                to inscricaoInstance.usuario.email
                from "contratualizacao@sms.fortaleza.ce.gov.br"
                subject "Registro on-line"
                html  myhtml
            } 
            render   """ 
            <h2>Bem vindo,</h2>
<p>Caro usuário, ${inscricaoInstance.usuario.userRealName}, o processo de inscrição on-line ocorreu com sucesso. </p>
<p><a href="${Configuracoes.link()}" ><font style="color:red;">Página de acesso às informações</font></a></p>
<p>Ao acessar essa página, digite o seu e-mail e senha.</p>
<p>Ao informar os dados necessários, você terá acesso às informações adicionais
de sua inscrição. Nessa página você poderá clicar
no botão &quot;imprimir &quot; que abrirá o aplicativo de impressão de seu computador. </p>
        """ 
        }
    }
    def show = {
        def inscricaoInstance = Inscricao.get(params.id)
        if (!inscricaoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), params.id])}"
            redirect(action: "list")
        }
        else {
            if(!inscricaoInstance.status){
                flash.message = "Estabelecimento inativo. Acesse o seu e-mail e siga as instruções "
                redirect(action: "error")
            }else{
                [inscricaoInstance: inscricaoInstance]
            }
        }
    }  
    def detalhes = {
        def inscricaoInstance = Inscricao.get(params.id)
        if (!inscricaoInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), params.id])}"
            redirect(action: "list")
        }
        else {
            if(!inscricaoInstance.status){
                flash.message = "Estabelecimento inativo. Acesse o seu e-mail e siga as instruções "
                redirect(action: "error")
            }else if(inscricaoInstance.chave != params.chave){
                flash.message = "Atenção! Você está tentando acessar uma página que você não tem permissão."
                redirect(action: "error")
            }else{
                [inscricaoInstance: inscricaoInstance]
            }
        }
    }   
    def update = {
        def inscricaoInstance = Inscricao.get(params.id)
        if (inscricaoInstance) {
            if (params.version) {
                def version = params.version.toLong()
                if (inscricaoInstance.version > version) {
                    inscricaoInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'inscricao.label', default: 'Inscricao')] as Object[], "Another user has updated this Inscricao while you were editing")
                    render(view: "edit", model: [inscricaoInstance: inscricaoInstance])
                    return
                }
            }
            inscricaoInstance.properties = params
            if (!inscricaoInstance.hasErrors() && inscricaoInstance.save(flush: true)) {
                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), inscricaoInstance.id])}"
                redirect(action: "show", id: inscricaoInstance.id)
            }
            else {
                render(view: "edit", model: [inscricaoInstance: inscricaoInstance])
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), params.id])}"
            redirect(action: "list")
        }
    }
    def delete = {
        def inscricaoInstance = Inscricao.get(params.id)
        if (inscricaoInstance) {
            try {
                inscricaoInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'inscricao.label', default: 'Inscricao'), params.id])}"
            redirect(action: "list")
        }
    }
    def autorize = {
        def inscricaoInstance = Inscricao.get(params.id)
        if(inscricaoInstance){
            inscricaoInstance.status = true
            inscricaoInstance.save()
            flash.message = "Ativado"
            redirect(action: "show", id: inscricaoInstance.id)
        }else{
            flash.message = "Erro"
            redirect(action: "list")
        }
    }
    //confimacao
    // Enviar email contendo as informacoes da inscricao
    def enviarEmail = { inscricaoInstance, link ->
        def myhtml = """
<center><img src="http://www.sms.fortaleza.ce.gov.br/sms_v2/Imagens/Layout/topoL2C1_logomarcaPMF.gif" /></center>
<h1>SMS - INSCRIÇÃO ON-LINE</h1>
<p>Você está recebendo esse e-mail para confirmar sua inscrição on-line. </p>
<p>Para isso, clique no link abaixo.</p>
<p><a href="${link}/inscricao/confirmacao?id=${inscricaoInstance.id}&chave=${inscricaoInstance.chave}">Validação</a></p>
<p>Caso voc&ecirc; n&atilde;o consiga acessar o link acima, copie o texto abaixo e cole na barra de endere&ccedil;os do seu navegador.</p>
<p>${link}/inscricao/confirmacao?id=${inscricaoInstance.id}&chave=${inscricaoInstance.chave}</p>

  <p style="text-align: justify">Atenciosamente,</p>
 <p>Comiss&atilde;o de Contratualiza&ccedil;&atilde;o dos Servi&ccedil;os de Sa&uacute;de de Fortaleza</p>
 """
        sendMail {
            to inscricaoInstance.usuario.email
            from "contratualizacao@sms.fortaleza.ce.gov.br"
            subject "Registro on-line"
            html  myhtml
        }
    }
    def valida = false;
    def menssagem = '';
    def valor = params.valor
    Valida validaCampos = new Valida()
    def cnpj = {
        menssagem = validaCampos.caracteres(valor,14,'CNPJ')
        if (  valor &&  valor.length() >= 14 ) {
            valida =  Valida.validaCNPJ(params.valor);
            menssagem = "CNPJ Invalido!";
        }       
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def cnes = {
        menssagem = validaCampos.caracteres(valor,6,'CNES');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def razaoSocial = {
        menssagem = validaCampos.caracteres(valor,4,'Razão Social');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def modalidadeAtendimento = {
        if (valor == 'null') {valor = null}
        menssagem = validaCampos.caracteres(valor,1,'Modalidade de Atendimento');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def endereco = {
        menssagem = validaCampos.caracteres(valor,6,'Endereço');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def dirigente = {
        menssagem = validaCampos.caracteres(valor,6,'Dirigente');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def responsavel = {
        menssagem = validaCampos.caracteres(valor,6,'Dirigente');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
     
    def telefone = {
        menssagem = validaCampos.caracteres(valor,8,'Telefone');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def username = {
        menssagem = validaCampos.caracteres(valor,5,'Usuário');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def userRealName = {
        menssagem = validaCampos.caracteres(valor,8,'Nome Completo');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def passwd = {
        menssagem = validaCampos.caracteres(valor,6,'Senha');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def pass = {
        menssagem = validaCampos.caracteres(valor,6,'Senha');
        if(!menssagem) {  valida = true  };
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def email = {
        menssagem = validaCampos.caracteres(valor,6,'E-mail')
        if (  valor &&  valor.length() >= 6 ) {
            valida =  Valida.validarEmail(params.valor);
            menssagem = "E-Mail Invalido!";
        }
        def validar = ['valida':valida , 'menssagem' : menssagem];
        render validar as JSON;
    }
    def atualizaPorCnpj = {
        def banco = inscricaoService.atualizaPorCnpj(params.valor)
        def result = ['nome':banco.nome , 'cnes':banco.cnes ,'endereco' : banco.endereco]
        render result  as JSON
    }
    def atualizaPorCnes = {
        def banco = inscricaoService.atualizaPorCnes(params.valor)
        def result = ['nome':banco.nome , 'cnpj':banco.cnpj ,'endereco' : banco.endereco]
        render result  as JSON
    }
    def ajaxEdit = {
        def banco =  inscricaoService.ajaxEdit(params.id)
        return [inscricaoInstanceAcompanhamento: banco.inscricaoInstanceAcompanhamento, inscricaoInstance:banco.inscricaoInstance,  itens: banco.itens , indexador: params.indexador ,usuario:banco.usuario]
        
    }
    def ajaxUpdate = {       
        def c = 0
        def sim = 0
        def nao = 0
        def status = 1
        def erro = false
        params.inscricaoItens.id.each{ 
            if ( params.itemObs[c].length() < 4 && params.itemStatus[c]  == '200' ) {
                // erro = true
            } else {
                params.itemObs[c].length() + params.itemStatus[c]
            }
 
            if  (params.itemStatus[c]  == '200' || params.itemStatus[c]  == '201' || params.itemStatus[c]  == '202' || params.itemStatus[c]  == '203') {
               nao++ // status = 3
            } else {
                if  (params.itemStatus[c]  == '100') {
                    sim++
                }
            }
            c++
        }
        if ( sim == c   ) {
            status = 2
        } else {

          if ( sim + nao == c   ) {
            status = 3
        }

        }
        
        if (!erro) {

             def inscricaoAcompanhamento =  InscricaoAcompanhamento.findAllByInscricao(Inscricao.get(params.inscricao.id),['sort':'id','order':'desc'])[0]
             def revisaoDeEmail = RevisaoDeEmail.findAllByInscricaoAcompanhamento(inscricaoAcompanhamento,['sort':'id','order':'desc'])[0]


            def person = new InscricaoAcompanhamento()
            person.properties = params
            person.status = status
            person.usuario = params.usuario.id

            if (person.save(flush:true)) {

                             if (revisaoDeEmail)  {

 if (revisaoDeEmail.mensagem > 2 ) {
          def  inscricaoAcompanhamentos =  person
            revisaoDeEmail = new RevisaoDeEmail()
            revisaoDeEmail.usuario    =   Usuario.findByUsername(authenticateService.principal().getUsername());
            revisaoDeEmail.inscricaoAcompanhamento = inscricaoAcompanhamentos
            revisaoDeEmail.mensagem = 4
            revisaoDeEmail.save()

                    println 'ok'
                }

             }

def inscricaoAcompanhamentoItensInstance = person

                def i = 0
                params.inscricaoItens.id.each{
                    def  inscricaoAcompanhamentoItens = new InscricaoAcompanhamentoItens()                    
                    inscricaoAcompanhamentoItens.inscricaoAcompanhamento =  inscricaoAcompanhamentoItensInstance
                    inscricaoAcompanhamentoItens.inscricaoItens =  InscricaoItens.get(params.inscricaoItens.id[i])
                    inscricaoAcompanhamentoItens.obs = params.itemObs[i]
                    inscricaoAcompanhamentoItens.status = params.itemStatus[i]
                    inscricaoAcompanhamentoItens.save(flush:true)

                    inscricaoAcompanhamentoItens.errors.allErrors.each {
                        println it
                    }
                    i++
                }
                render InscricaoAcompanhamento.situacao(person.status)
            } else {
                person.errors.allErrors.each {
                    println it
                }
                render 'nao'
            }
        } else {
            render 'Erro'
        }
    }
    private void addRoles(person) {
        for (String key in params.keySet()) {
            if ( 'on' == params.get(key)) {
                InscricaoItens.findByAuthority(key).addToPeople(person)
            }
        }
    }
    private Map buildPersonModel(person ,  inscricaoInstance   ,indexador , usuario) {
        List roles = InscricaoItens.list()
        roles.sort { r1, r2 ->
            r1.authority <=> r2.authority
        }
        Set userRoleNames = []
        for (role in person.itensFaltando) {
            userRoleNames << role.authority
        }
        LinkedHashMap<InscricaoAcompanhamento, Boolean> roleMap = [:]
        for (role in roles) {
            roleMap[(role)] = userRoleNames.contains(role.authority)
        }

        return [inscricaoInstanceAcompanhamento: person, person:inscricaoInstance,  roleMap: roleMap , indexador: indexador ,usuario:usuario]
    }
    def blank = {
        render ''
    }
    def mailRender = {
        render '<img src="../images/ajax-barra.gif"  alt="carregando" id="imgAjax" /><br>Salvando '
    }
    // listagem de todos os processos a ser gerado o email
    def menssagemRevisao = {
        return    inscricaoService.menssagemRevisao()
    }
    //ver o e-mail  a ser liberado
    def revisao = {
        return    inscricaoService.revisao(params.acompanhamento)
    }

    // Envia o Email do Resultado

    def enviaEmailResultado = {
        def result = inscricaoService.enviaEmailResultado(params.id, params.recurso)
        def status = 3
        if(params.recurso) {
            status = 6
        }
        if (result.revisaoDeEmail) {
            def revisaoDeEmail = new RevisaoDeEmail()
            revisaoDeEmail.usuario = result.usuario
            revisaoDeEmail.inscricaoAcompanhamento = result.revisaoDeEmail.inscricaoAcompanhamento
            revisaoDeEmail.mensagem = status
            if (revisaoDeEmail.save()) {
                sendMail {
               to result.mail
               from "contratualizacao@sms.fortaleza.ce.gov.br"
                subject "Registro on-line"
               html  result.html
             }
             render  "Enviado"
            } else {
                render  "Erro"
            }

        } else {

 render  "Erro"
        }

    }



    def saveRevisao = {
        def revisaoDeEmail = new RevisaoDeEmail(params)
        revisaoDeEmail.save()
        revisaoDeEmail.errors.allErrors.each {
            println it
        }
        render revisaoDeEmail
        redirect(action: "menssagemRevisao")
    }








}
